/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.optimus.bo.impl;

import com.optimus.bo.ElementoPublicitarioBO;
import com.optimus.common.cvo.EPCampanaCVO;
import com.optimus.common.cvo.EPCampanaCVOList;
import com.optimus.common.cvo.ElementoPublicitarioCVO;
import com.optimus.common.cvo.ElementoPublicitarioCVOList;
import com.optimus.common.cvo.MapaCVO;
import com.optimus.common.cvo.MapaCVOList;
import com.optimus.common.cvo.VerificadorVOList;
import com.optimus.common.util.ApplicationException;
import com.optimus.common.util.ConstantesDB;
import com.optimus.common.vo.CampanaVO;
import com.optimus.common.vo.EPCampanaVO;
import com.optimus.common.vo.MapaVO;
import com.optimus.common.vo.PuntosMapaVO;
import com.optimus.common.vo.ResultadoVO;
import com.optimus.common.vo.VerificadorVO;
import com.optimus.db.dao.EPCampanaDAO;
import com.optimus.db.dao.MapaDAO;
import com.optimus.db.dao.PuntosMapaDAO;
import com.optimus.db.dao.VerificadorDAO;
import com.optimus.db.dao.impl.EPCampanaDAOImpl;
import com.optimus.db.dao.impl.MapaDAOImpl;
import com.optimus.db.dao.impl.PuntosMapaDAOImpl;
import com.optimus.db.dao.impl.VerificadorDAOImpl;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author victor
 */
public class ElementoPublicitarioBOImpl implements ElementoPublicitarioBO {

    private static Logger logger = LoggerFactory.getLogger(ElementoPublicitarioBOImpl.class);

    private EPCampanaDAO epcdao;
    private VerificadorDAO verificadorDAO;
    private MapaDAO mapaDAO;
    private PuntosMapaDAO puntosMapaDAO;

    public ElementoPublicitarioBOImpl(){
        epcdao = new EPCampanaDAOImpl();
        verificadorDAO = new VerificadorDAOImpl();
        mapaDAO = new MapaDAOImpl();
        puntosMapaDAO = new PuntosMapaDAOImpl();
    }
    public ResultadoVO generarRutaOptima(ElementoPublicitarioCVOList elementoPublicitarioList,CampanaVO campanaVO) throws ApplicationException {
        Object[] params = new Object[2];
        ResultadoVO resultadoVO = new ResultadoVO();
        resultadoVO.setTicket(elementoPublicitarioList.getTicket());
        int contador = 1;
        try {
            EPCampanaVO item = null;
            List<ElementoPublicitarioCVO> lista =elementoPublicitarioList.getLista();
            //generarRutaOptima(lista);
            for (ElementoPublicitarioCVO object : lista) {
                item = new EPCampanaVO();
                item.setTicket(elementoPublicitarioList.getTicket());
                item.setIdCampanaRecoleccion(campanaVO.getIdCampanaRecoleccion());
                item.setCodigoEP(object.getIdElementoPublicitario());
                item.setEstadoRegistro( "A");
                //item.setOrden(contador++);
                item.setOrden(object.getOrden());
                item.setT(ConstantesDB.OPERATION_MODE);
                item.setIdUsuario(ConstantesDB.USER_ONE); //FIXME usuario de session
                item.setFechaCreacion(new Date());//FIXME
                item.setCorrelMarca(1);
                item.setIdCliente(1);
                item.setMarcaCompetencia("");
                item.setNoCompetencia("");
                //epcdao.actualizarOrden(item);
                epcdao.guardar(item);
            }
            resultadoVO.setCodigo(ConstantesDB.STATUS_OK);

        } catch (Exception e) {
            resultadoVO.setCodigo(ConstantesDB.STATUS_FAIL);
        } finally {
            logger.debug("params={}",params);
        }
        return resultadoVO;

    }

    public ResultadoVO generarMapas(CampanaVO campanaVO) throws ApplicationException {
        Object[] params = new Object[2];
        ResultadoVO resultadoVO = new ResultadoVO();
        Long tk =campanaVO.getTicket();
        resultadoVO.setTicket(tk);
        int contador = 0;
        int posicionInicial=0;
        int posicionFinal=0;
        MapaVO mapaVO = null;
        Integer codigoVerificador= 0;
        EPCampanaCVO item=null;
        try {
            mapaVO = new MapaVO();
            mapaVO.setTicket(tk);
            logger.debug("IdCampanaRecoleccion: " + campanaVO.getIdCampanaRecoleccion());
            mapaVO.setIdCampanaRecoleccion(campanaVO.getIdCampanaRecoleccion());
            /*MapaCVOList mapaLista= mapaDAO.listar(mapaVO);

            if (mapaLista.getLista()!=null){
                logger.debug("Borrando Mapas");
                for (MapaCVO it : mapaLista.getLista()) {
                    PuntosMapaVO puntosMapaVO = new PuntosMapaVO();
                    puntosMapaVO.setTicket(tk);
                    puntosMapaVO.setIdMapa(it.getIdMapa());
                    puntosMapaDAO.eliminar(puntosMapaVO);
                    mapaDAO.eliminar(it);
                }
            }*/
            VerificadorVO verificadorVO = new VerificadorVO();
            verificadorVO.setTicket(tk);
            VerificadorVOList vOList= verificadorDAO.listar(verificadorVO);
            Integer numeroVerificadores=vOList.getLista().size();
            EPCampanaCVO ePCampanaCVO = new EPCampanaCVO();
            ePCampanaCVO.setTicket(tk);
            ePCampanaCVO.setIdCampanaRecoleccion(campanaVO.getIdCampanaRecoleccion());
            EPCampanaCVOList pCampanaVOList= epcdao.listar(ePCampanaCVO);
            List<EPCampanaCVO> lista=pCampanaVOList.getLista();
            int longitudSegmento =numeroVerificadores.intValue()>0?lista.size()/numeroVerificadores.intValue():0;
            while(contador<numeroVerificadores){

                codigoVerificador=vOList.getLista().get(contador).getIdVerificador();
                mapaVO = new MapaVO();
                mapaVO.setIdVerificador(codigoVerificador);
                mapaVO.setDescripcion("Mapa "+ ( codigoVerificador.intValue()+ 1) );
                mapaVO.setIdUsuario(ConstantesDB.USER_ONE);
                mapaVO.setEstadoRegistro("A");
                mapaVO.setFechacreacion(new Date());
                mapaVO.setIdCampanaRecoleccion(campanaVO.getIdCampanaRecoleccion());
                mapaVO.setT(ConstantesDB.OPERATION_MODE);
                mapaVO.setTicket(tk);
                mapaVO = mapaDAO.insertar(mapaVO);
                PuntosMapaVO puntosMapaVO = null;
                posicionFinal=(contador+1)*longitudSegmento;
                posicionFinal=posicionFinal>lista.size()?lista.size():posicionFinal;

                for(int i=posicionInicial;i<posicionFinal;i++){
                    item= lista.get(i);
                    puntosMapaVO = new PuntosMapaVO();
                    puntosMapaVO.setFechaCreacion( new Date());
                    puntosMapaVO.setIdElementoPublicitario(item.getCodigoEP());
                    puntosMapaVO.setIdMapa(mapaVO.getIdMapa());
                    puntosMapaVO.setIdUsuario(ConstantesDB.USER_ONE);
                    puntosMapaVO.setItem(i - posicionInicial +1);
                    puntosMapaVO.setLatitud(item.getLatitud());
                    puntosMapaVO.setLongitud(item.getLongitud());
                    puntosMapaVO.setOrden(item.getOrden());
                    puntosMapaVO.setT(ConstantesDB.OPERATION_MODE);
                    puntosMapaVO.setTicket(tk);
                    puntosMapaVO.setTipoPunto(ConstantesDB.TP_ELEMENTO_PUBLICITARIO);
                    puntosMapaDAO.insertar(puntosMapaVO);
                }
                posicionInicial=posicionFinal;
                contador++;
            }
            resultadoVO.setCodigo(ConstantesDB.STATUS_OK);

        } catch (Exception e) {
            resultadoVO.setCodigo(ConstantesDB.STATUS_FAIL);
        } finally {
            logger.debug("params={}",params);
        }
        return resultadoVO;
    }

    public MapaCVOList listarMapa(MapaVO mapaVO) throws ApplicationException {
        Object[] logParams = new Object[2];
        MapaCVOList result = new MapaCVOList();
        Long tk = mapaVO.getTicket();
        result.setTicket(tk);
        try {
            logParams[0]="obteniendo mapas";
            logParams[1]=tk;
            result=mapaDAO.listar(mapaVO);
            if(result.getLista()!=null && result.getLista().size()<1){
                return result;
            }
                VerificadorVO verificadorVO = new VerificadorVO();
                verificadorVO.setTicket(tk);
                VerificadorVOList vOList= verificadorDAO.listar(verificadorVO);
            if(vOList.getLista()==null|| vOList.getLista().size()<1){
                return result;
            }
            List<MapaVO> mapaLista = new ArrayList<MapaVO>();
            for (MapaCVO item : result.getLista()) {
                mapaLista.add((MapaVO)item);
            }

            for (MapaCVO item : result.getLista()) {
                item.setVerificadores(vOList.getLista());
                item.setMapas(mapaLista);
            }
            
        } catch (Exception e) {
        }finally{
            logger.debug("msg={} ticket={}",logParams);
        }
        return result;

    }

    public ResultadoVO eliminar(EPCampanaVO ePCampanaVO) throws ApplicationException {
        return epcdao.eliminar(ePCampanaVO);
    }

}
